<?php

namespace UFSW\UsuarioBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use UFSW\DataBaseBundle\Entity\Usuario;
use UFSW\UsuarioBundle\Form\UsuarioType;
use Symfony\Component\HttpFoundation\Request;


class UsuarioController extends Controller
{
    /**
     * Vistas: son los archivos html a los que vamos a redireccionar repetidas veces
     */
    protected $indexVista;
    protected $verVista;
    protected $nuevoVista;
    protected $editarVista;
    protected $editPassVista;
    
    public function __construct() {
        $this->indexVista = 'UsuarioBundle:Usuario:index.html.twig';
        $this->portadaVista = 'UsuarioBundle:Usuario:portada.html.twig';
        $this->verVista = 'UsuarioBundle:Usuario:ver.html.twig';
        $this->nuevoVista = 'UsuarioBundle:Usuario:nuevo.html.twig';
        $this->editarVista = 'UsuarioBundle:Usuario:editar.html.twig';
        $this->editPassVista = 'UsuarioBundle:Usuario:password.html.twig';
    }
    
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();
        $usuarios = $em->getRepository('UFSWDataBaseBundle:Usuario')->findAll();
        return $this->render($this->indexVista, array(
            'usuarios' => $usuarios,
        ));
    }
    
    public function registroAction()
    {
        $peticion = $this->getRequest();

        $usuario = new Usuario();
        $formulario   = $this->createForm(new UsuarioType(), $usuario);
        
        if ($peticion->getMethod() == 'POST') { 
            $formulario->bind($peticion);
            if ($formulario->isValid()) { 
                $em = $this->getDoctrine()->getEntityManager();
                $encoder = $this->get('security.encoder_factory')->getEncoder($usuario); 
                $usuario->setSalt(md5(time())); 
                $passwordCodificado = $encoder->encodePassword( $usuario->getPassword(), $usuario->getSalt() );
                $usuario->setPassword($passwordCodificado);
                
                $slug = $em->getRepository('UFSWDataBaseBundle:Usuario')->findRealSlug($usuario);
                $usuario->setSlug($slug);
                
                $em->persist($usuario); 
                $em->flush();
                
                return $this->redirect($this->generateUrl('login')); 
            }
        }    
            return $this->render($this->nuevoVista, array(
                'usuario' => $usuario,
                'form' => $formulario->createView(),
            ));
    }
    
    public function verAction($usuario) 
    {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('UFSWDataBaseBundle:Usuario')->findOneBySlug($usuario);
        return $this->render($this->verVista, array(
            'usuario' => $user,
        ));
    }
    
    public function editarAction($usuario)
    {
        $peticion = $this->getRequest();
        
        $em = $this->getDoctrine()->getManager();
        $usuario = $em->getRepository('UFSWDataBaseBundle:Usuario')->findOneBySlug($usuario);
        $formulario   = $this->createForm(new UsuarioType(), $usuario);
        
        if ($peticion->getMethod() == 'POST') {
            $passwordOriginal = $formulario->getData()->getPassword();
            $formulario->bind($peticion);
            if ($formulario->isValid()) {
                if (null == $usuario->getPassword()) {
                    $usuario->setPassword($passwordOriginal);
                } else {
                    $encoder = $this->get('security.encoder_factory')->getEncoder($usuario); 
                    $usuario->setSalt(md5(time())); 
                    $passwordCodificado = $encoder->encodePassword( $usuario->getPassword(), $usuario->getSalt() );
                    $usuario->setPassword($passwordCodificado);
                }
                $em = $this->getDoctrine()->getManager(); 
                $em->persist($usuario); 
                $em->flush();
                
                return $this->redirect($this->generateUrl('usuario_ver', array(
                'usuario' => $usuario,
                )));
            }
        }    
        
        return $this->render($this->editarVista, array(
            'usuario' => $usuario,
            'form' => $formulario->createView(),
        ));
    }
    
    public function editPassAction($usuario)
    {
        $request = $this->getRequest();
        
        $em = $this->getDoctrine()->getManager();
        $usuario = $em->getRepository('UFSWDataBaseBundle:Usuario')->find($usuario);
        
        if ($request->getMethod() == 'POST') {
            $passwordOriginal = $usuario->getPassword();
            $oldPass = $request->get('oldPass');
            $newPass = $request->get('passNueva');
            $newPassRep = $request->get('passRep');
            
            
            $encoder = $this->get('security.encoder_factory')->getEncoder($usuario); 
            $usuario->setSalt(md5(time())); 
            $oldPassCod = $encoder->encodePassword( $oldPass, $usuario->getSalt() );
                
            if (($oldPassCod = $passwordOriginal) && ($newPass = $newPassRep)) {
                
                $newPassCod = $encoder->encodePassword( $newPass, $usuario->getSalt() );
                $usuario->setPassword($newPassCod);
                    
                $em = $this->getDoctrine()->getManager(); 
                $em->persist($usuario); 
                $em->flush();
                
                return $this->redirect($this->generateUrl('logout'));
            } else {
                $error = 'error.contraseñas';
                
                return $this->render($this->editPassVista, array(
                    'usuario' => $usuario,
                    'error' => $error,
                ));
            }
        }
        return $this->render($this->editPassVista, array(
            'usuario' => $usuario,
            'error' => null,
        ));
    }
    
    
    //@TODO: Crear una buena pagina de portada luego
    public function portadaAction($usuario) 
    {
        $em = $this->getDoctrine()->getManager();
        $usuario = $em->getRepository('UFSWDataBaseBundle:Usuario')->findOneBySlug($usuario);
        return $this->render($this->portadaVista, array(
            'usuario' => $usuario,
        ));
    }
}
